// 导入axios
import axios from 'axios';

// 导入token状态
import { useTokenStore } from '@/store/token.js';
// 导入显示登录框状态
import { useShowLoginDialogStore } from '@/store/showLoginDiaolg';
// 引入我们自己封装的ElNotification组件
import notification from './notification.js';

const baseURL = '/api';
const instance = axios.create({
    baseURL: baseURL,
    timeout: 10 * 2000, // 超时时间：20s
})

// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        const tokenStore = useTokenStore()
        if (tokenStore.token) {
            // 如果token中有值，再携带
            config.headers.token = tokenStore.token
        }
        return config
    },
    (err) => {
        return Promise.reject(err)
    }
)

// 响应拦截器
instance.interceptors.response.use(
    (response) => {
        const { showLoading, errorCallBack, showError } = response.config

        // 处理Blob
        if (response.data instanceof Blob) {
            return response;
        }

        // 解析返回结果
        if (response.data.code === 1) {
            return response.data;
        }

        // 代码走到这里，代表业务状态码不是0，本次操作失败
        notification.error(response.data.msg ? response.data.msg : '服务异常');

        return Promise.reject(response.data);
    },
    (err) => {
        const { showLoading, errorCallBack, showError } = err.config
        // 若没有token，则需要弹出登录框
        if (errorCallBack) {
            console.log("调用失败回调函数")
            errorCallBack()
        }

        // 判断响应状态码，如果为401，则证明未登录，提示请登录，并显示登录框
        if (err.response.status === 401) {
            console.log('请先登录')
            // 显示登录框
            const showLoginDialogStore = useShowLoginDialogStore()
            showLoginDialogStore.setShowLoginDialog(true)
        } else {
            console.log('服务异常')
        }
        return Promise.reject(err);
    }
)

export default instance;